package com.im.message.service;

import com.im.common.model.message.GroupChatMessageContent;
import com.im.common.model.message.MessageContent;
import com.im.message.dao.ImGroupMessageHistoryEntity;
import com.im.message.dao.ImMessageBodyEntity;
import com.im.message.dao.ImMessageHistoryEntity;
import com.im.message.dao.mapper.ImGroupMessageHistoryMapper;
import com.im.message.dao.mapper.ImMessageBodyMapper;
import com.im.message.dao.mapper.ImMessageHistoryMapper;
import com.im.message.model.DoStoreGroupMessageDto;
import com.im.message.model.DoStoreP2PMessageDto;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

/**
 * 存储消息的服务类
 */
@Service
public class StoreMessageService {

    @Autowired
    private ImMessageHistoryMapper imMessageHistoryMapper;
    @Autowired
    private ImMessageBodyMapper imMessageBodyMapper;
    @Autowired
    private ImGroupMessageHistoryMapper imGroupMessageHistoryMapper;

    /**
     * 执行存储点对点消息的操作
     *
     * @param doStoreP2PMessageDto 存储点对点消息的数据传输对象
     */
    @Transactional
    public void doStoreP2PMessage(DoStoreP2PMessageDto doStoreP2PMessageDto) {
        // 存储消息体
        imMessageBodyMapper.insert(doStoreP2PMessageDto.getImMessageBodyEntity());

        // 提取消息内容并转换为点对点消息历史记录实体列表
        List<ImMessageHistoryEntity> imMessageHistoryEntities = extractToP2PMessageHistory(doStoreP2PMessageDto.getMessageContent(), doStoreP2PMessageDto.getImMessageBodyEntity());

        // 批量插入点对点消息历史记录
        imMessageHistoryMapper.insertBatchSomeColumn(imMessageHistoryEntities);
    }

    /**
     * 提取消息内容并转换为点对点消息历史记录实体列表
     *
     * @param messageContent      消息内容
     * @param imMessageBodyEntity 消息体实体
     * @return 点对点消息历史记录实体列表
     */
    public List<ImMessageHistoryEntity> extractToP2PMessageHistory(MessageContent messageContent, ImMessageBodyEntity imMessageBodyEntity) {
        List<ImMessageHistoryEntity> list = new ArrayList<>();

        // 构造发送方的消息历史记录实体
        ImMessageHistoryEntity fromHistory = new ImMessageHistoryEntity();
        BeanUtils.copyProperties(messageContent, fromHistory);
        fromHistory.setOwnerId(messageContent.getFromId());
        fromHistory.setMessageKey(imMessageBodyEntity.getMessageKey());
        fromHistory.setCreateTime(System.currentTimeMillis());
        fromHistory.setSequence(messageContent.getMessageSequence());

        // 构造接收方的消息历史记录实体
        ImMessageHistoryEntity toHistory = new ImMessageHistoryEntity();
        BeanUtils.copyProperties(messageContent, toHistory);
        toHistory.setOwnerId(messageContent.getToId());
        toHistory.setMessageKey(imMessageBodyEntity.getMessageKey());
        toHistory.setCreateTime(System.currentTimeMillis());
        toHistory.setSequence(messageContent.getMessageSequence());

        list.add(fromHistory);
        list.add(toHistory);
        return list;
    }

    /**
     * 执行存储群组消息的操作
     *
     * @param doStoreGroupMessageDto 存储群组消息的数据传输对象
     */
    @Transactional
    public void doStoreGroupMessage(DoStoreGroupMessageDto doStoreGroupMessageDto) {
        // 存储消息体
        imMessageBodyMapper.insert(doStoreGroupMessageDto.getImMessageBodyEntity());

        // 提取消息内容并转换为群组消息历史记录实体
        ImGroupMessageHistoryEntity imGroupMessageHistoryEntity = extractToGroupMessageHistory(doStoreGroupMessageDto.getGroupChatMessageContent(), doStoreGroupMessageDto.getImMessageBodyEntity());

        // 插入群组消息历史记录
        imGroupMessageHistoryMapper.insert(imGroupMessageHistoryEntity);
    }

    /**
     * 提取消息内容并转换为群组消息历史记录实体
     *
     * @param messageContent     群组消息内容
     * @param messageBodyEntity  消息体实体
     * @return 群组消息历史记录实体
     */
    private ImGroupMessageHistoryEntity extractToGroupMessageHistory(GroupChatMessageContent messageContent, ImMessageBodyEntity messageBodyEntity) {
        ImGroupMessageHistoryEntity result = new ImGroupMessageHistoryEntity();
        BeanUtils.copyProperties(messageContent, result);
        result.setGroupId(messageContent.getGroupId());
        result.setMessageKey(messageBodyEntity.getMessageKey());
        result.setCreateTime(System.currentTimeMillis());
        return result;
    }
}
